Docker MachineでAmazon EC2をコントロールする
はじめに
先日、Dockerから新機能のリリースがありました。
様々な環境にコマンド一発でDocker環境を構築するDocker Machine(ベータ版)、複数のDocker Engineを集約して一つのDocker Engineに見せるクラスタリングツールであるDocker Swarm、そして複数のDockerコンテナで構成されるアプリケーションをデプロイするオーケストレーションツールであるDocker Composeです。
この3つの機能をAWSに特化した形で有しているのがAmazon EC2 Container Service(ECS)ですが、いろいろな環境で使えるツールをDockerがオフィシャルに出してきたという意味で、インパクトのある発表でした。
さて、今回はDocker Machineを使って、Amazon EC2を操作してみたいと思います。なおDocker Machineのドキュメントはこちら。
やってみた
今回はAmazon EC2で構築したAmazon Linux上で実行しています。
Docker Machineのインストール
Docker Machineはバイナリファイルで提供されているため、ドキュメントに記載されたリンクからバイナリファイルをダウンロードしてきて、実行権限を付与するだけです。
$ wget https://github.com/docker/machine/releases/download/v0.1.0/docker-machine_linux-386 -O docker-machine $ chmod 755 docker-machine
試しに実行してみると、ちゃんと動作してることがわかります。
$ sudo ./docker-machine -v docker-machine version 0.1.0
Docker Machineの作成
Docker MachineはAmazon EC2を始め、Microsoft AzureやDigitalOcean、Google Compute Engine、SoftLayerなど、主要なクラウドサービスほとんどのドライバーが提供されています。今回はAmazon EC2用のドライバーを使用します。
オプションの詳細はドキュメントを参照してください。AMIは東京リージョンにあるUbuntu 14.04 LTSのAMIを使っています。またアクセスキーとシークレットアクセスキーは必須になっているため、IAM Roleによるアクセス権には対応していないようです。
$ sudo ./docker-machine create --driver amazonec2 --amazonec2-access-key YOUR_ACCESS_KEY --amazonec2-secret-key YOUR_SECRET_KEY --amazonec2-region ap-northeast-1 --amazonec2-ami ami-a1bf56a1 --amazonec2-vpc-id YOUR_VPC_ID ec2 INFO[0000] Launching instance... INFO[0019] Waiting for SSH on 54.178.155.151:22 INFO[0082] Configuring Machine... INFO[0209] "ec2" has been created and is now the active machine. INFO[0209] To point your Docker client at it, run this in your shell: $(docker-machine env ec2)
以下のように、Amazon EC2インスタンスが立ち上がってきます。
docker-machine lsで確認すると、ちゃんとec2というDocker Machineが登録されています。
$ sudo ./docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM ec2 * amazonec2 Running tcp://54.178.155.151:2376
Dockerクライアントを使うための環境定義はdocker-machine envで取得出来ます。なので$(docker-machine env ec2)と実行すれば、ec2というDocker Machineを使うための環境変数が設定出来ます。
$ sudo ./docker-machine env ec2 export DOCKER_TLS_VERIFY=yes export DOCKER_CERT_PATH=/root/.docker/machine/machines/ec2 export DOCKER_HOST=tcp://54.178.155.151:2376
Docker Machine上でコンテナを実行する
docker-machine configを実行すると、Dockerクライアントに渡すためのパラメータが出力されます。
$ docker-machine config ec2 --tls --tlscacert=/root/.docker/machines/ec2/ca.pem --tlscert=/root/.docker/machines/ec2/cert.pem --tlskey=/root/.docker/machines/ec2/key.pem -H tcp://54.178.155.151:2376
なので、コンテナ実行はDockerクライアントにdocker-machine configの出力結果を引数として渡した上で、普通に実行します。
$ sudo docker $(sudo ./docker-machine config ec2) run busybox echo hello classmethod Unable to find image 'busybox:latest' locally busybox:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Status: Downloaded newer image for busybox:latest hello classmethod
docker psコマンドで確認すると、コンテナが実行された形跡が確認出来ます。
$ sudo docker $(sudo ./docker-machine config ec2) ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ecef939a6898 busybox:latest "echo hello classmet About a minute ago Exited (0) About a minute ago pensive_pasteur
これだけだと、本当にDocker MachineとなっているAmazon EC2上で実行されているのか確証が持てないので、以下のようなこともやってみました。
$ sudo docker $(sudo ./docker-machine config ec2) run busybox wget http://169.254.169.254/latest/meta-data/instance-id -O - | head i-3ac25bc9
インスタンスメタデータからDocker MachineとなっているAmazon EC2のインスタンスIDが取得出来ています。
ちゃんとEC2上で実行されていますね!
その他のDocker Machineの操作
Docker Machineを停止するにはdocker-machine stopを実行します。
$ sudo ./docker-machine stop ec2
すると以下のようにEC2インスタンス自体が停止します。
Docker Machineを起動するにはdocker-machine startを実行します。
$ sudo ./docker-machine start ec2
すると以下のようにEC2インスタンス自体が起動します。
Docker Machineを削除するにはdocker-machine rmを実行します。
$ sudo ./docker-machine rm ec2
すると以下のようにEC2インスタンスがターミネートされされます。
以上のように、docker-machineコマンドだけで全ての操作が出来ちゃいます。
さいごに
SwarmとComposeを組み合わせることで、どんなクラウドサービスでも同じようにコンテナをオーケストレーション出来るというのは、かなりスゴいことだと思います。最近のDockerは周辺ツールもどんどんオフィシャルに出してきていて、他のベンダがこれまで作ってきたツールとどのような関係性になるのか、というところが気にかかっていますが、これによってDocker周辺が一層盛り上がるのであれば、それはそれで良いのかもしれませんね。SwarmとComposeについても今後触ってみたいと思います。